# pip install pyvis -i https://pypi.tuna.tsinghua.edu.cn/simple/
# pip install --force-reinstall pyvis

import networkx as nx
from pyvis.network import Network

# G = nx.karate_club_graph()
# net = Network(
#     height="750px", 
#     width="100%",
# ) 

# net.from_nx(G)
# for node in net.nodes:
#     club = G.nodes[node['id']]['club']
#     node['label'] = f"Node {node['id']} - {club}"
#     node['color'] = 'blue' if club == 'Mr. Hi' else 'red'

# net.show("my_graph.html", notebook = False)


# nx_graph = nx.cycle_graph(10)
# nx_graph.nodes[1]['title'] = 'Number 1'
# nx_graph.nodes[1]['group'] = 1
# nx_graph.nodes[3]['title'] = 'I belong to a different group!'
# nx_graph.nodes[3]['group'] = 10
# nx_graph.add_node(20, size=20, title='couple', group=2)
# nx_graph.add_node(21, size=15, title='couple', group=2)
# nx_graph.add_edge(20, 21, weight=5)
# nx_graph.add_node(25, size=25, label='lonely', title='lonely node', group=3)

# nt = Network('500px', '500px')
# nt.from_nx(nx_graph)
# nt.show('nx.html', notebook = False)

# 创建空图
G = nx.Graph()
# 添加带属性的节点
# G.add_node(1, label="root1", size=15, color="blue")
# G.add_node(2, label="child2", size=10, color="red")
# G.add_node(3, label="child3", size=5, color="green")
# 批量添加
# G.add_nodes_from([
#     (2, {"color": "red"}),
#     (3, {"color": "green"}),
# ])
# 添加带权重的边
# G.add_edge(1, 2, weight=0.5, color="black")
# 批量添加边
# G.add_edges_from([(1,3), (3,2)])
G.add_node(1, label="张角", description="张角是东汉末年黄巾起义的领袖，与弟弟张梁、张宝共同发动起义，号召百姓反抗官府。")
G.add_node(2, label="张梁", description="张梁是张角的弟弟，与张角、张宝一起发动黄巾起义，参与反抗官府的斗争。")
G.add_node(3, label="张宝", description="张宝是张角的弟弟，与张角、张梁一起发动黄巾起义，参与反抗官府的斗争。")
G.add_node(4, label="汉灵帝", description="汉灵帝是东汉时期的皇帝，面对黄巾起义的威胁，下令各地官军防备，并派遣中郎将卢植、皇甫嵩、朱隽率军镇压起义。")
G.add_node(5, label="卢植", description="卢植是汉灵帝派遣的中郎将之一，负责镇压黄巾起义，与皇甫嵩、朱隽共同作战。")
G.add_node(6, label="皇甫嵩", description="皇甫嵩是汉灵帝派遣的中郎将之一，负责镇压黄巾起义，与卢植、朱隽共同作战。")
G.add_node(7, label="朱隽", description="朱隽是汉灵帝派遣的中郎将之一，负责镇压黄巾起义，与卢植、皇甫嵩共同作战。")
G.add_node(8, label="邹靖", description="邹靖是幽州太守的属下，建议招募兵马以对抗张角兄弟的黄巾军。")
G.add_node(9, label="刘备", description="刘备是涿县的一位贫寒人物，靠贩麻鞋、织草席为生，因看到招募义军的榜文而加入黄巾起义。")
G.add_node(10, label="张飞", description="张飞是涿县的一位卖酒、屠宰猪羊的商人，愿意拿出家产与刘备共同干一番大事业，后成为刘备的结义兄弟。")
G.add_node(11, label="关羽", description="关羽是涿县的一位屠户，与刘备、张飞一起结为兄弟，后成为刘备的重要将领。")
G.add_node(12, label="黄巾军", description="黄巾军是张角兄弟领导的起义军，以头裹黄巾为标志，号召百姓反抗官府，声势浩大。")
G.add_node(13, label="涿县", description="涿县是刘备、张飞、关羽三人结为兄弟的地方，也是他们开始反抗官府的地方。")
G.add_node(14, label="桃园", description="桃园是刘备、张飞、关羽结为异姓兄弟的地点，象征着他们的兄弟情谊和共同的志向。")

G.add_edge(1, 2, weight=1, label="兄弟", description="张角与张梁是兄弟，共同领导黄巾起义，反抗官府的压迫。")
G.add_edge(1, 3, weight=1, label="兄弟", description="张角与张宝是兄弟，共同领导黄巾起义，反抗官府的压迫。")
G.add_edge(1, 12, weight=1, label="领袖", description="张角是黄巾军的领袖，领导起义军反抗东汉朝廷的腐败统治。")
G.add_edge(4, 12, weight=1, label="镇压", description="汉灵帝是东汉皇帝，面对黄巾军的起义，下令镇压，派遣军队进行镇压。")
G.add_edge(5, 12, weight=1, label="镇压", description="卢植是汉灵帝派遣的将领之一，负责镇压黄巾军的起义活动。")
G.add_edge(6, 12, weight=1, label="镇压", description="皇甫嵩是汉灵帝派遣的将领之一，负责镇压黄巾军的起义活动。")
G.add_edge(7, 12, weight=1, label="镇压", description="朱隽是汉灵帝派遣的将领之一，负责镇压黄巾军的起义活动。")
G.add_edge(8, 12, weight=1, label="镇压", description="邹靖是幽州太守的属下，建议招募兵马对抗黄巾军，参与镇压起义。")
G.add_edge(9, 12, weight=1, label="成员", description="刘备是黄巾军的成员之一，因看到招募义军的榜文而加入起义军。")
G.add_edge(10, 12, weight=1, label="成员", description="张飞是黄巾军的成员之一，愿意出资与刘备共同干一番大事业，加入起义军。")
G.add_edge(11, 12, weight=1, label="成员", description="关羽是黄巾军的成员之一，因被刘备、张飞的义气所打动而加入起义军。")
G.add_edge(9, 10, weight=1, label="结义兄弟", description="刘备与张飞是结义兄弟，共同参与起义，合作对抗官府。")
G.add_edge(9, 11, weight=1, label="结义兄弟", description="刘备与关羽是结义兄弟，共同参与起义，合作对抗官府。")
G.add_edge(10, 11, weight=1, label="结义兄弟", description="张飞与关羽是结义兄弟，共同参与起义，合作对抗官府。")
G.add_edge(9, 14, weight=1, label="结义", description="刘备与张飞、关羽在桃园结义，宣誓成为异姓兄弟，象征他们的兄弟情谊。")
G.add_edge(10, 14, weight=1, label="结义", description="张飞与刘备、关羽在桃园结义，宣誓成为异姓兄弟，象征他们的兄弟情谊。")
G.add_edge(11, 14, weight=1, label="结义", description="关羽与刘备、张飞在桃园结义，宣誓成为异姓兄弟，象征他们的兄弟情谊。")
G.add_edge(9, 13, weight=1, label="居住", description="刘备是涿县的一位贫寒人物，靠贩麻鞋、织草席为生，因看到招募义军的榜文而加入黄巾起义。")
G.add_edge(10, 13, weight=1, label="居住", description="张飞是涿县的一位卖酒、屠宰猪羊的商人，愿意拿出家产与刘备共同干一番大事业，后成为刘备的结义兄弟。")

# 查找连接最多的前3个节点
degree_centrality = nx.degree_centrality(G)
top_nodes = sorted(degree_centrality.items(), key=lambda x: x[1], reverse=True)[:3]
print("连接最多的节点:", top_nodes)

# 查找刘备到张角的最短路径
shortest_path = nx.shortest_path(G, source=9, target=1)  # 9是刘备，1是张角
print("刘备到张角的最短路径:", shortest_path)

# 查询所有"结义兄弟"关系
brother_edges = [(u, v) for u, v, attr in G.edges(data=True) if attr.get('label') == '结义兄弟']
print("结义兄弟关系:", brother_edges)

# 查询特定节点的邻居
print("张角的邻居:", list(G.neighbors(1)))  # 节点ID为1的张角

# 查询黄巾军所有直接相关人员和关系
huangjin_related = []
for u, v, attr in G.edges(data=True):
    if u == 12 or v == 12:  # 12是黄巾军节点ID
        relation = {
            'source': G.nodes[u]['label'],
            'target': G.nodes[v]['label'],
            'relation': attr.get('label'),
            'description': attr.get('description') if attr.get('description') else ''
        }
        huangjin_related.append(relation)
print("黄巾军直接关系:", huangjin_related)

nt = Network('800px', '100%')
nt.from_nx(G)
nt.show('test.html', notebook = False)


# (entity<|>张角<|>person<|>张角是东汉末年黄巾起义的领袖，与弟弟张梁、张宝共同发动起义，号召百姓反抗官府。)<|>
# (entity<|>张梁<|>person<|>张梁是张角的弟弟，与张角、张宝一起发动黄巾起义，参与反抗官府的斗争。)<|>
# (entity<|>张宝<|>person<|>张宝是张角的弟弟，与张角、张梁一起发动黄巾起义，参与反抗官府的斗争。)<|>
# (entity<|>汉灵帝<|>person<|>汉灵帝是东汉时期的皇帝，面对黄巾起义的威胁，下令各地官军防备，并派遣中郎将卢植、皇甫嵩、朱隽率军镇压起义。)<|>
# (entity<|>卢植<|>person<|>卢植是汉灵帝派遣的中郎将之一，负责镇压黄巾起义，与皇甫嵩、朱隽共同作战。)<|>
# (entity<|>皇甫嵩<|>person<|>皇甫嵩是汉灵帝派遣的中郎将之一，负责镇压黄巾起义，与卢植、朱隽共同作战。)<|>
# (entity<|>朱隽<|>person<|>朱隽是汉灵帝派遣的中郎将之一，负责镇压黄巾起义，与卢植、皇甫嵩共同作战。)<|>
# (entity<|>邹靖<|>person<|>邹靖是幽州太守的属下，建议招募兵马以对抗张角兄弟的黄巾军。)<|>
# (entity<|>刘备<||>person<|>刘备是涿县的一位贫寒人物，靠贩麻鞋、织草席为生，因看到招募义军的榜文而加入黄巾起义。)<|>
# (entity<|>张飞<|>person<|>张飞是涿县的一位卖酒、屠宰猪羊的商人，愿意拿出家产与刘备共同干一番大事业，后成为刘备的结义兄弟。)<|>
# (entity<|>关羽<|>person<|>关羽是因乡里恶霸仗势欺人而杀恶霸后逃亡的侠士，因刘备、张飞的敬佩而加入他们的义军，成为结义兄弟。)<|>
# (entity<|>黄巾军<|>organization<|>黄巾军是张角兄弟领导的起义军，以头裹黄巾为标志，号召百姓反抗官府，声势浩大。)<|>
# (entity<|>涿县<|>location<|>涿县是刘备、张飞、关羽相遇并结义的地方，也是黄巾起义的重要活动区域之一。)<|>
# (entity<|>桃园<|>location<|>桃园是刘备、张飞、关羽结为异姓兄弟的地点，象征着他们的兄弟情谊和共同的志向。)<|>
# (relationship<|>张角<|>张梁<|>brotherhood, rebellion<|>张角与张梁是兄弟，共同领导黄巾起义，反抗官府的压迫。)<|>
# (relationship<|>张角<|>张宝<|>brotherhood, rebellion<|>张角与张宝是兄弟，共同领导黄巾起义，反抗官府的压迫。)<|>
# (relationship<|>张角<|>黄巾军<|>leadership, rebellion<|>张角是黄巾军的领袖，领导起义军反抗东汉朝廷的腐败统治。)<|>
# (relationship<|>汉灵帝<|>黄巾军<|>opposition, suppression<|>汉灵帝是东汉皇帝，面对黄巾军的起义，下令镇压，派遣军队进行镇压。)<|>
# (relationship<|>卢植<|>黄巾军<|>military confrontation, suppression<|>卢植是汉灵帝派遣的将领之一，负责镇压黄巾军的起义活动。)<|>
# (relationship<|>皇甫嵩<|>黄巾军<|>military confrontation, suppression<|>皇甫嵩是汉灵帝派遣的将领之一，负责镇压黄巾军的起义活动。)<|>
# (relationship<|>朱隽<|>黄巾军<|>military confrontation, suppression<|>朱隽是汉灵帝派遣的将领之一，负责镇压黄巾军的起义活动。)<|>
# (relationship<|>邹靖<|>黄巾军<|>military confrontation, suppression<|>邹靖是幽州太守的属下，建议招募兵马对抗黄巾军，参与镇压起义。)<|>
# (relationship<|>刘备<|>黄巾军<|>recruitment, rebellion<|>刘备是黄巾军的成员之一，因看到招募义军的榜文而加入起义军。)<|>
# (relationship<|>张飞<|>黄巾军<|>recruitment, rebellion<|>张飞是黄巾军的成员之一，愿意出资与刘备共同干一番大事业，加入起义军。)<|>
# (relationship<|>关羽<|>黄巾军<|>recruitment, rebellion<|>关羽是黄巾军的成员之一，因被刘备、张飞的义气所打动而加入起义军。)<|>
# (relationship<|>刘备<|>张飞<|>brotherhood, cooperation<|>刘备与张飞是结义兄弟，共同参与起义，合作对抗官府。)<|>
# (relationship<|>刘备<|>关羽<|>brotherhood, cooperation<|>刘备与关羽是结义兄弟，共同参与起义，合作对抗官府。)<|>
# (relationship<|>张飞<|>关羽<|>brotherhood, cooperation<|>张飞与关羽是结义兄弟，共同参与起义，合作对抗官府。)<|>
# (relationship<|>刘备<|>桃园<|>location, oath<|>刘备与张飞、关羽在桃园结义，宣誓成为异姓兄弟，象征他们的兄弟情谊。)<|>
# (relationship<|>张飞<|>桃园<|>location, oath<|>张飞与刘备、关羽在桃园结义，宣誓成为异姓兄弟，象征他们的兄弟情谊。)<|>
# (relationship<|>关羽<|>桃园<|>location, oath<|>关羽与刘备、张飞在桃园结义，宣誓成为异姓兄弟，象征他们的兄弟情谊。)<|>
# <|COMPLETE|>